package leetcode.editor.cn;
//给定一个仅包含数字 2-9 的字符串，返回所有它能表示的字母组合。 
//
// 给出数字到字母的映射如下（与电话按键相同）。注意 1 不对应任何字母。 
//
// 
//
// 示例: 
//
// 输入："23"
//输出：["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
// 
//
// 说明: 
//尽管上面的答案是按字典序排列的，但是你可以任意选择答案输出的顺序。 
// Related Topics 字符串 回溯算法 
// 👍 930 👎 0

import java.util.*;

/**
 * Java：电话号码的字母组合
 *
 * @author：紫水木鱼
 * @createDate：2020-09-24 14:48:32
 */
class P17LetterCombinationsOfAPhoneNumber {
    public static void main(String[] args) {
        Solution solution = new P17LetterCombinationsOfAPhoneNumber().new Solution();
        System.out.println(solution.letterCombinations("432432"));
        // TO TEST
    }

    //leetcode submit region begin(Prohibit modification and deletion)
    class Solution {
        public List<String> letterCombinations(String digits) {
            List<String> res = new ArrayList<>();
            String oneRes = "";
            if (digits.equals("")) {
                return res;
            }
            String[] dict = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
            int[] digiInt = new int[digits.length()];
            for (int i = 0; i < digits.length(); i++) {
                digiInt[i] = digits.charAt(i) - '0';
            }

            combi(digiInt, 0, dict, res, oneRes);
            return res;
        }
    }

    public void combi(int[] digits, int n, String[] dict, List<String> res, String oneRes) {
        if (n == digits.length) {
            res.add(oneRes);
            return;
        }
        for (int j = 0; j < dict[digits[n]].length(); j++) {
            oneRes = oneRes + dict[digits[n]].charAt(j);
            combi(digits, n + 1, dict, res, oneRes);
            oneRes = oneRes.substring(0, oneRes.length() - 1);
        }
    }
//leetcode submit region end(Prohibit modification and deletion)

}